package cn.qf.base;

public class DataType {

    public static void main(String[] args) {
        // 整型：byte(1字节)、short(2字节)、int(4字节)、long(8字节)
        // 字面量：
        // - 可以是十进制、八进制（0开头）、十六进制（0x|0X开头）、二进制整数（0b|0B）
        // - long(长整型)的字面量（值的表现形式）需要在末尾增加一个 l|L 字母
        byte vByte = 127; // 十进制
        vByte = 0B111; // 二进制
        vByte = 0xF; // 十六进制
        vByte = 071; // 八进制

        short vShort = 32767;
        vShort = 0xFFF;

        int vInt = 386;

        long vLong = 4294967295L;
        vLong = 0xFFFFFFFFL;
        vLong = 0b11111110000111L;

        // 浮点型: float(4字节)、double(8字节)
        // 字面量：
        // - 可以用十进制形式 和 科学计数法(e|E)
        // - float 类型的字面量需要在末尾增加 f|F 字母
        // - double 类型的字面量可以在末尾增加 d|D 字母表示，也可以不加
        float vFloat = 3.14159265f;
        double vDouble = 3.14159265;

        // float vFloat1 = 0.5; // Wrong. 0.5 默认表示双精度 double
        float vFloat2 = (float)0.5; // 强制类型转换：double -> float

        float vFloat3 = 3.14E2F; // 科学计数法表示单精度数
        float vFloat4 = 3.14e-2F;

        double vDouble2 = 100e2; // 科学计数法表示双精度数
        double vDouble3 = 10E-8;

        // 字符型：char(2字节)
        // 字面量：
        // - 用单引号包裹的一个字符、转义字符(\n、\t、\\等) 或 汉字（一个汉字的Unicode码是2字节）。
        // - char 可以自动转型为 int，转换时会自动使用字符的 Unicode 码作变 int 类型的值
        char ch = 'a';
        int intChar = ch;
        System.out.println(intChar); // 97

        char vChar = '国';
        int intChar2 = vChar;
        System.out.println(intChar2); // 22269

        // 布尔型：boolean (值：true | false)
        // 布尔型常用于存储 关系（比较）运算、逻辑运算的结果。
        int score = 78;
        boolean isValid = score >= 60;

        boolean vBool = false;

        // 字符串：java.lang.String 类型
        // 字面量：用双引号包裹的一个字符序列
        String vStr = "abc1234xxxx+-*/#$$%&&&^*&&*&**";

        // 基本数据类型转换：
        // 自动类型转换：直接将小单位的值赋给大单位，无需任何其他代码
        // 强制类型转换：
        // 小容量数据类型 变量名 = (小容量数据类型)大容量数据类型的变量或值;
        byte vByte2 = 0b1001;
        int vInt2 = vByte2; // 自动类型转换

        long vLong2 = 0xFFFFFFFFL;
        short vShort2 = (short)vLong2;
        byte vByte3 = (byte)3547879789878L;
    }
}
